<?php
/**
 * @author			JiangYegen
 * @package 		PHP连接MySQL类
 * @copyright		Copyright (c) 2013-04-4,
 *
 *------------------------------------------------------------------
 *在工程所有文件中均不需要单独初始化这个类，可直接用 $db 进行操作
 *为了防止错误，操作完后不必关闭数据库
 *------------------------------------------------------------------
*/
//db_config为配置文件的参数
$db = new DB($db_config["hostname"], $db_config["username"], $db_config["password"], $db_config["database_map"],$db_config);
class DB {
	    private $link_id;
	    private $handle;
	    private $is_log;
	    private $time;

     //构造函数

     public function __construct($hostname, $username, $password, $database,$db_config) {

         $this->time = $this->microtime_float();

         $this->connect($hostname, $username, $password, $database,$db_config["pconnect"],$db_config["charset"]);

         $this->is_log = $db_config["log"];

         if($this->is_log){
             $handle = fopen($db_config["logfilepath"]."dblog.txt", "a+");
             $this->handle=$handle;
         }

     }

	    //数据库连接
	    public function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0,$charset) {
	        if( $pconnect==0 ) {
	            $this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw, true);
	            if(!$this->link_id){
	                $this->halt("数据库连接失败");
	            }
	        } else {
	            $this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw);
	            if(!$this->link_id){
	                $this->halt("数据库持久连接失败");
	            }
	        }
	        if(!@mysql_select_db($dbname,$this->link_id)) {
	            $this->halt('数据库选择失败');
	        }
	        $str = explode("-",$charset);
	        $chat0 = $str[0];
	        $chat1 = $str[1];
	        @mysql_query("set character set ".$chat0."-".$chat1);
	        @mysql_query("set names ".$chat0.$chat1);
	    }

	    //查询
	    public function query($sql) {
	        $this->write_log("查询 ".$sql);
	        $query = @mysql_query($sql,$this->link_id);
	        if(!$query) $this->halt('Query Error: ' . $sql);
	        return $query;
	    }

	    //获取一条记录（MYSQL_ASSOC，MYSQL_NUM，MYSQL_BOTH）
	    public function get_one($sql,$result_type = MYSQL_ASSOC) {
	        $query = $this->query($sql);
	        @$rt =& mysql_fetch_array($query,$result_type);
	        $this->write_log("获取一条记录 ".$sql);
	        return $rt;
	    }

	    //获取全部记录
	    public function get_all($sql,$result_type = MYSQL_ASSOC) {
	        $query = $this->query($sql);
	        $i = 0;
	        $rt = array();
	        while(@$row =& mysql_fetch_array($query,$result_type)) {
	            $rt[$i]=$row;
	            $i++;
	        }
	        $this->write_log("获取全部记录 ".$sql);
	        return $rt;
	    }

	    //插入
	    public function insert($table,$dataArray) {
	        $field = "";
	        $value = "";
	        if( !is_array($dataArray) || count($dataArray)<=0) {
	            $this->halt('没有要插入的数据');
	            return false;
	        }
	        while(@list($key,$val)=each($dataArray)) {
	            $field .="$key,";
	            $value .="'$val',";
	        }
	        $field = substr( $field,0,-1);
	        $value = substr( $value,0,-1);
	        $sql = "insert into $table($field) values($value)";
	        $this->write_log("插入 ".$sql);
	        if(!$this->query($sql)) return false;
	        return true;
	    }

	    //更新
	    public function update( $table,$dataArray,$condition="") {
	        if( !is_array($dataArray) || count($dataArray)<=0) {
	            $this->halt('没有要更新的数据');
	            return false;
	        }
	        $value = "";
	        while( @list($key,$val) = each($dataArray))
	        $value .= "$key = '$val',";
	        $value .= substr( $value,0,-1);
	        $sql = "update $table set $value where 1=1 and $condition";
	        $this->write_log("更新 ".$sql);
	        if(!$this->query($sql)) return false;
	        return true;
	    }

	    //删除
	    public function delete( $table,$condition="") {
	        if( empty($condition) ) {
	            $this->halt('没有设置删除的条件');
	            return false;
	        }
	        $sql = "delete from $table where 1=1 and $condition";
	        $this->write_log("删除 ".$sql);
	        if(!$this->query($sql)) return false;
	        return true;
	    }

	    //返回结果集
	    public function fetch_array($query, $result_type = MYSQL_ASSOC){
	        $this->write_log("返回结果集");
	        return mysql_fetch_array($query, $result_type);
	    }

	    //获取记录条数
	    public function num_rows($results) {
	        if(!is_bool($results)) {
	            $num = mysql_num_rows($results);
	            $this->write_log("获取的记录条数为".$num);
	            return $num;
	        } else {
	            return 0;
	        }
	    }

	    //释放结果集
	    public function free_result() {
	        $void = func_get_args();
	        foreach($void as $query) {
	            if(is_resource($query) && get_resource_type($query) === 'mysql result') {
	                return mysql_free_result($query);
	            }
	        }
	        $this->write_log("释放结果集");
	    }

	    //获取最后插入的id
	    public function insert_id() {
	        $id = mysql_insert_id($this->link_id);
	        $this->write_log("最后插入的id为".$id);
	        return $id;
	    }

	    //获取自动增长Auto_increment的值
	    public function auto_id($results) {
	    	$result = mysql_result($results,0,'Auto_increment');
	    	$this->write_log("表中Auto_increment为".$result);
	    	return $result;
	    }

	   //关闭数据库连接
	    protected function close() {
	        $this->write_log("已关闭数据库连接");
	        return @mysql_close($this->link_id);
	    }

	    //错误提示
	    private function halt($msg='') {
	    	$emsg = '';
	    	$msg .= mysql_error();
	    	$emsg .= "<div><h3>Error Warning!</h3>\r\n";
	    	$emsg .= "<div><a href='http://www.193xx.com' target='_blank' style='color:red'>Technical Support : 星讯网手机数码商城</a></div>";
	    	$emsg .= "<div style='font-size:14px;color:green'>\r\n";
	    	$emsg .= "<div style='color:blue'><br />Error page: <font color='red'>".$this->GetCurUrl()."</font></div>\r\n";
	    	$emsg .= "<div>Error infos: {$msg}</div>\r\n";
	    	$emsg .= "<br /></div></div>\r\n";
	    	$savemsg = 'Page: '.$this->GetCurUrl()."\r\nError: ".$msg;
	        $this->write_log($savemsg);
	        die($emsg);
	    }

	    //获得当前的脚本网址
	    public function GetCurUrl()
	    {
	    	    $pageURL = 'http';

			    if (@$_SERVER["HTTPS"] == "on")
			    {
			        $pageURL .= "s";
			    }
			    $pageURL .= "://";

			    $this_page = $_SERVER["REQUEST_URI"];

			    // 只取 ? 前面的内容
			    if (strpos($this_page, "?") !== false)
			        @$this_page = reset(explode("?", $this_page));

			    if ($_SERVER["SERVER_PORT"] != "80")
			    {
			        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $this_page;
			    }
			    else
			    {
			        $pageURL .= $_SERVER["SERVER_NAME"] . $this_page;
			    }
			    return $pageURL;
	    }


	    //析构函数
	    public function __destruct() {
	        $this->free_result();
	        $use_time = ($this-> microtime_float())-($this->time);
	        $this->write_log("完成整个查询任务,所用时间为".$use_time);
	        if($this->is_log){
	            fclose($this->handle);
	        }
	    }

	    //写入日志文件
	    public function write_log($msg=''){
	        if($this->is_log){
	            $text = date("Y-m-d H:i:s")." ".$msg."\r\n";
	            fwrite($this->handle,$text);
	        }
	    }

	    //获取毫秒数
	    public function microtime_float() {
	        list($usec, $sec) = explode(" ",microtime());
	        return ((float)$usec + (float)$sec);
	    }
	    
	    //分页处理
	    public function pagedeal($pagesql, $pagesize) {
	    
	    	global $recordcount, $pagecount, $page, $startloc;
	    
	    	$rs = mysql_query($pagesql);
	    	$recordcount = mysql_num_rows($rs); //取得记录总数
	    	//******计算总页数*******/
	    	if ($recordcount % $pagesize == 0)
	    		$pagecount = $recordcount / $pagesize;
	    	else
	    		$pagecount = intval($recordcount / $pagesize) + 1;
	    
	    	if (empty($page) || $page < 1)//$page是当前页
	    		$page = 1;
	    
	    	if ($page > $pagecount)
	    		$page = $pagecount;
	    
	    	$startloc = ($page - 1) * $pagesize; //确定当前页的起始记录
	    	//-----------------当前页的前部分数字分页----------------------//
	    	if ($page <= 2);
	    	$i = 0;
	    	if ($page > 2 && $pagecount - $page < 2 && $pagecount > 4)
	    		$i = $pagecount - 4;
	    	if ($page > 2 && $pagecount - $page >= 2)
	    		$i = $page - 2;
	    	for (; $i < $page; $i++)
	    		$numpage[$i] = $i + 1;
	    
	    		//--------------当前页的后半部分(包括当前页)数字分页------------//
	    		$j = $pagecount;
	    		if ($page <= 2 && $pagecount > 4)
	    			$j = 4;
	    			if ($page > 2 && $pagecount - $page >= 2)
	    			$j = $page + 2;
	    			for (; $i < $j; $i++)
	    			$numpage[$i] = $i + 1;
	    
	    			return @$numpage; //返回数字分页
	    }
	    
	    public function pagedealArray($pagesql, $pagesize) {
	    
		    global $recordcount, $pagecount, $page, $startloc;
		    
		    $recordcount = $pagesql; //取得记录总数
		    //******计算总页数*******/
		    if ($recordcount % $pagesize == 0)
		    $pagecount = $recordcount / $pagesize;
		    else
		    	$pagecount = intval($recordcount / $pagesize) + 1;
		    
		    	if (empty($page) || $page < 1)//$page是当前页
		    $page = 1;
		    
		    if ($page > $pagecount)
		    	$page = $pagecount;
		    
		    	$startloc = ($page - 1) * $pagesize; //确定当前页的起始记录
		    	//-----------------当前页的前部分数字分页----------------------//
		    	if ($page <= 2)
		    	;
		    	$i = 0;
		    	if ($page > 2 && $pagecount - $page < 2 && $pagecount > 4)
		    	$i = $pagecount - 4;
		    	if ($page > 2 && $pagecount - $page >= 2)
		    		$i = $page - 2;
		    		for (; $i < $page; $i++)
		    		$numpage[$i] = $i + 1;
		    
		    		//--------------当前页的后半部分(包括当前页)数字分页------------//
		    		$j = $pagecount;
		    		if ($page <= 2 && $pagecount > 4)
		    		$j = 4;
		    		if ($page > 2 && $pagecount - $page >= 2)
		    			$j = $page + 2;
		    			for (; $i < $j; $i++)
		    			$numpage[$i] = $i + 1;
		    
		    			return $numpage; //返回数字分页
	    }

	}
?>